<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // var p1 = getNumAsync(1, true, 2000);
    // var p2 = getNumAsync(2, true, 3000);
    // var p3 = getNumAsync(3, true, 1000);

    // p1.then(function (v) {
    //     console.log("p1已成功", v);
    //     return p2; // p2
    // }).then(function (v) {
    //     console.log("p2已成功", v);
    //     return p3;  //p3
    // }).then(function (v) {
    //     console.log("p3已成功", v);
    // }).catch(function (err) {
    //     console.log("已失败", err);
    // })


    // 模拟封装
    /* Promise.myRace = function (list) {
        return new Promise(function (resolve, reject) {
            for (let i = 0; i < list.length; i++) {
                let p = list[i];// p1  p2  p3  (异步操作 => pending)
                p.then(data => {  // p的状态改变之后(异步 未来改变状态)
                    // arr.push(data); // !!!!  => 谁快 谁先放   => 对应Promise实例的顺序
                    resolve(data);
                }).catch(err => {
                    reject(err);
                })
            }
        })

    }


    var p1 = getNumAsync(1, false, 200);
    var p2 = getNumAsync(2, true, 3000);
    var p3 = getNumAsync(3, true, 1000);

    var p = Promise.myRace([p1, p2, p3]);

    p.then(arg => {
        console.log("已成功", arg);
    }).catch(err => {
        console.log("已失败", err);
    }) */



    function getNumAsync(val, isFulfilled = true, delay = 1000) {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () { // 1s后 变为 成功/失败状态 
                isFulfilled ? resolve(val) : reject(val);
            }, delay);
        })
        return p; // Promise <pending>
    }




</script>
<script>
    // 构造函数Promise的方法  => 构造函数自己用  (Array.from   String.fromCharCode)
    // Promise.all()
    // Promise.race()
    // Promise.resolve()
    // Promise.reject()

    // Promise.race()
    // Promise.race()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // var p = Promise.race([p1, p2, p3]);

    // 只要p1、p2、p3之中有一个实例率先改变状态(无论变为已成功 还是已失败)，p的状态就跟着改变。那个率先改变的 Promise 实例的返回值，就传递给p的回调函数。


    // 总结
    // 谁快谁先变,无论成功/失败

    // T = T1 / T2 / T3 最快的


    var p1 = getNumAsync(1, false, 200);
    var p2 = getNumAsync(2, true, 3000);
    var p3 = getNumAsync(3, true, 1000);

    var p = Promise.race([p1, p2, p3]);

    p.then(arr => {
        console.log("已成功", arr);
    }).catch(err => {
        console.log("已失败", err);
    })



    function getNumAsync(val, isFulfilled = true, delay = 1000) {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () { // 1s后 变为 成功/失败状态 
                isFulfilled ? resolve(val) : reject(val);
            }, delay);
        })
        return p; // Promise <pending>
    }

</script>

</html>